#include <stdio.h>

int main1()
{
    // 打开一个文件 文件名 + 读写
    // 文件打开失败返回NULL
    // 下面的是相对地址
    // . 表示当前目录
    // .. 表示上一级路径
    FILE *p = fopen("date.txt", "w");
    if (p == NULL)
    {
        // 打开失败打印错误信息
        perror("fopen");
        return 1;
    }
    // 关闭文件
    fclose(p); 
    return 0;
}

int main2()
{
    FILE * pf = fopen("data.txt", "w");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // fputc('a', pf);
    fputs("hello bird!", pf);
    fclose(pf);
    return 0;
}

// 实现文件的拷贝
int main3()
{
    // 打开源文件
    FILE *pf_src = fopen("data.txt", "r");
    if (pf_src == NULL)
    {
        // 报错
        perror("fopen->data.txt");
        return 1;
    }
    // 打开目标文件
    FILE *pf_dst = fopen("data_copy.txt", "w");
    if (pf_dst == NULL)
    {
        // 报错
        // 关掉第一个文件
        fclose(pf_src);
        perror("fopen->data_copy.txt");
        return 1;
    }
    char ch = 0;
    // 数据读取失败会返回EOF 一般是 End of File
    while ((ch = fgetc(pf_src)) != EOF)
    {
        fputc(ch, pf_dst);
    }
    // 关闭打开的文件
    fclose(pf_src);
    fclose(pf_dst);
    return 0;
}

int main4()
{
    // 打开文件
    FILE *pf = fopen("data.txt", "r");
    if (pf == NULL)
    {
        fclose(pf);
        perror("fopen"); 
    }
    char arr[20] = { 0 };
    // 10个数据里面最后一个 \0 也占了一份
    fgets(arr, 11, pf);
    printf("%s", arr);
    fclose(pf); 
    return 0;
}

typedef struct 
{
    char name[20];
    int age;
    int score;
} stu;

// 格式化写入 -- 类比printf 只不过是往文件里面写
int main5()
{
    stu stu1 = {"wang yi ming", 100, 100};
    FILE *pf = fopen("data.txt", "w");
    if (pf == NULL)
    {
        perror("fopen"); 
        return 1;
    }
    
    fprintf(pf, "%s %d %d", stu1.name, stu1.age, stu1.score);

    fclose(pf);
    return 0;
}


// 格式化输出 -- 类比scanf只不过是从文件里面读
int main()
{
    stu stu1 = { 0 };
    FILE *pf = fopen("data.txt", "r");
    if (pf == NULL)
    {
        perror("fopen"); 
        return 1;
    }
    
    fscanf(pf, "%s %d %d", stu1.name, &stu1.age, &stu1.score);
    fprintf(stdout, "%s %d %d", stu1.name, stu1.age, stu1.score);

    fclose(pf);
    return 0;
}